home *** CD-ROM | disk | FTP | other *** search
/ Tiger Disk 6 / Tiger_Disk_006_19xx_Tiger-Crew-Disk_de_Side_B.d64 / 12 mk (.txt) < prev    next >
Commodore BASIC  |  2023-02-26  |  7KB  |  176 lines

  1. 8 clr
  2. 10 u$="[197][197][197][197][197][197][197][197][197][197]":o$="[164][164][164][164][164][164][164][164][164]":i$="input-routine":b$=" bildschirm"
  3. 101 data169,255,133,1,169,3,133,2,160,0,230,1,208,4,230,2,48
  4. 102 data14,177,1,208,244,200,177,1,208,237,200,177,1,208,232,96
  5. 200 print"[147][164][164][164]";o$;o$;o$;o$:print"syntax-lehrgang 'maschinensprache' (12)
  6. 210 [153]"tototototototo";o$:[153]"3. suchroutinen "
  7. 220 [153]"ein gleichermassen  wichtiges wie haeu-
  8. 230 print"figes problem stellen die  suchroutinen
  9. 240 [153]"dar.  wir lernen in dieser lektion, wie
  10. 250 print"suchroutinen aufgebaut sind.
  11. 260 [153]"der vorteil von  suchroutinen,   die in
  12. 270 print"maschinensprache geschrieben sind,  ist
  13. 280 [153]"ihre um ein vielfaches (ca faktor 1000)
  14. 290 print"hoehere geschwindigkeit.
  15. 300 [140]:[129]i[178]0[164]32:[135]x:[151]826[170]i,x:[130]
  16. 310 i[178]1:[141]5000:[139]fl[167]200
  17. 400 [153]"loadwir werden den prinzipiellen aufbau von
  18. 410 print"suchroutinen  an einer  einfachen such-
  19. 420 [153]"routine studieren.
  20. 430 print"wir wollen den bereich  $0400 bis $8000
  21. 440 [153]"nach der bytefolge '$00-$00-$00' durch-
  22. 450 print"suchen.wir suchen also die adresse des-
  23. 460 [153]"jenigen speichers,   dessen inhalt  und
  24. 470 print"gleichzeitig auch der inhalt der beiden
  25. 480 [153]"folgenden speicher gleich null ist.
  26. 490 print"diese  adresse ist  die endadresse  des
  27. 500 [153]"gerade im ram stehenden basicprogramms.
  28. 520 i=2:gosub5000:ifflthen200
  29. 600 print"[147]wir benoetigen  einen zaehler,  der von
  30. 605 [153]"$0400 bis $8000 zaehlen kann.der inhalt
  31. 606 print"des speichers,    dessen adresse dieser
  32. 610 [153]"zaehler angibt,  wird auf  den wert $00
  33. 615 print"geprueft.  ist der inhalt ungleich $00,
  34. 620 [153]"so wird der zaehler um eins erhoeht.ist
  35. 630 print"er gleich $00,so werden auch die beiden
  36. 640 [153]"folgenden speicher auf $00 geprueft.
  37. 650 print"sind sie nicht beide null, so wird wei-
  38. 660 [153]"tergesucht,  andernfalls wird die suche
  39. 670 print"abgebrochen. maximal soll bis $8000 ge-
  40. 680 [153]"sucht werden.
  41. 720 i=3:gosub5000:ifflthen400
  42. 800 print"[147]als zaehler verwenden wir  die speicher
  43. 805 [153]"$01/$02. es muessen 2 speicher sein, da
  44. 810 print"die adressen 2 byte umfassen. wir waeh-
  45. 815 [153]"len zeropage-speicher, da diese erstens
  46. 820 print"schneller ansprechbar sind und zweitens
  47. 830 [153]"indirekt indiziert werden koennen.
  48. 930 i=4:gosub5000:ifflthen600
  49. 1000 print"[147]zuerst laden wir die startadresse minus
  50. 1010 [153]"1 in diese beiden speicher.dabei beach-
  51. 1020 print"ten wir die reihenfolge   niederwertig/
  52. 1030 [153]"hoeherwertig (low/high):
  53. 1040 print"      lda #$ff
  54. 1050 [153]"      sta $01   $ff nach $01
  55. 1060 print"      lda #$03
  56. 1070 [153]"      sta $02   $03 nach $02
  57. 1080 print"da wir  indirekt indiziert  adressieren
  58. 1090 [153]"wollen, laden wir das yr mit $00:
  59. 1100 print"      ldy #$00
  60. 1130 i[178]5:[141]5000:[139]fl[167]800
  61. 1200 [153]"loadwir beginnen nun  die suchschleife  mit
  62. 1210 print"dem  erhoehen  der  adresse in speicher
  63. 1220 [153]"$01/$02 um 1:
  64. 1230 print"     inc $01   erhoehen des low-bytes
  65. 1240 [153]"   or_bne $04   = 0 ?
  66. 1250 print"   [221][157][221] inc $02   erhoehen des high-bytes
  67. 1260 [153]"   (NULL)cmd(NULL) bmi $..   = $80 ?
  68. 1270 print"   [221][157][173][192]....
  69. 1275 [153]"wegen bne wird  $02 nur  beim auftreten
  70. 1280 print"eines ueberlaufs um 1 erhoeht.
  71. 1290 [153]"mit bmi springt  man bei  erreichen von
  72. 1300 print"$8000 an eine stelle, wo rts steht.
  73. 1320 i[178]6:[141]5000:[139]fl[167]1000
  74. 1400 [153]"loadnun erfolgt die abfrage,  ob der inhalt
  75. 1410 print"des speichers, dessen adresse in $01/02
  76. 1420 [153]"steht, gleich null ist. falls nein, er-
  77. 1430 print"folgt der sprung zu der stelle,  wo die
  78. 1440 [153]"adresse in $01/02 inkrementiert wird.
  79. 1450 print"      lda ($01),y  beachte: y=0!
  80. 1460 [153]"      bne $..      sprung zu 'inc $01'
  81. 1530 i=7:gosub5000:ifflthen1200
  82. 1600 print"[147]falls ja, gehts weiter mit dem nachfol-
  83. 1610 [153]"genden speicher:
  84. 1620 print"      iny          jetzt: y=1
  85. 1630 [153]"      lda ($01),y
  86. 1640 print"      bne $..      sprung zu 'ldy #$00'
  87. 1650 [153]"falls auch dieser null ist,  wird  auch
  88. 1655 print"noch der dritte speicher geprueft:
  89. 1660 [153]"      iny          jetzt: y=2
  90. 1670 print"      lda ($01),y
  91. 1680 [153]"      bne $..      sprung zu 'ldy #$00'
  92. 1690 print"und falls auch der null ist,erfolgt der
  93. 1700 [153]"      rts          ruecksprung zu basic
  94. 1710 i=8:gosub5000:ifflthen1400
  95. 1800 print"[147]nun noch mal alles zusammen:
  96. 1805 [153]"      lda #$ff      startadr = 03ff
  97. 1810 print"      sta $01
  98. 1815 [153]"      lda #$03
  99. 1820 print"      sta $02
  100. 1825 [153]"  ortantantanldy #$00      y, start = 0
  101. 1826 print"  [221]
  102. 1830 [153]"  (NULL)ortantaninc $01       adr = adr + 1
  103. 1835 print"  [221][221][176]_bne $..       = 0 ?
  104. 1840 [153]"  (NULL)(NULL)(NULL) inc $02
  105. 1845 print" [176][221][221][221]_bmi $..       ende ?
  106. 1846 [153]" (NULL)(NULL)(NULL)(NULL)
  107. 1850 print" [221][221][221][173][192]lda ($01),y   y = 0
  108. 1855 [153]" (NULL)(NULL)/tan_bne $..       = 0 ?
  109. 1856 print" [221][221]
  110. 1860 [153]" (NULL)(NULL)   iny           y = 1
  111. 1865 print" [221][221]   lda ($01),y
  112. 1870 [153]" (NULL)-tantan_bne $..       = 0 ?
  113. 1875 print" [221][221]   iny           y = 2
  114. 1880 [153]" (NULL)(NULL)   lda ($01),y
  115. 1885 print" [221][173][192][192]_bne $..       = 0 ?
  116. 1900 [153]" /tantantantanrts           ende
  117. 1910 i=9:gosub5000:ifflthen1600
  118. 2000 print"[147]nun ein kleiner probelauf!    wir rufen
  119. 2005 [153]"die routine mit sys 826 auf und drucken
  120. 2010 print"dann die in $01/02 stehende adresse de-
  121. 2020 [153]"zimal aus: adr = peek(1) + 256*peek(2).
  122. 2040 print"damit sie ein gefuehl bekommen, wie fix
  123. 2050 [153]"das geht,   lassen wir den cbm waehrend
  124. 2055 print"dem suchen einen weissen balken auf den
  125. 2060 [153]"bildschirm setzen.
  126. 2070 print"sind sie bereit (j/n) ?
  127. 2090 [161]x$:[139]x$[179][177]"j"[167]2090
  128. 2100 [129]c[178]0[164]10:[129]w[178]0[164]400[172][180](c):[130]w:[153]"on   cmdcmdcmd";10[171]c:[130]c
  129. 2110 [153]"on          wait":[158]826:[153]"onadr =";[194](1)[170]256[172][194](2);"       "
  130. 2120 [153]"schnell, nicht wahr ?!
  131. 2130 i=10:gosub5000:ifflthen1800
  132. 2200 print"[147]eine  erste  nutzanwendung fuer  dieses
  133. 2220 [153]"programm ist die berechnung  der laenge
  134. 2230 print"von basic-programmen.ein basic-programm
  135. 2240 [153]"beginnt stets bei $0400=1024  und endet
  136. 2250 print"mit  eben  dem  speicher,  wo die  drei
  137. 2260 [153]"nullen beginnen.
  138. 2270 print"wir wuerden also schreiben:
  139. 2280 [153]"  1. 'sys 826'":[153]"  2. 'print peek(1)+256*peek(2)-1024'
  140. 2290 print"und erhielten  als ergebnis  die laenge
  141. 2295 [153]"des basic-programmes in byte.
  142. 2310 i=11:gosub5000:ifflthen2000
  143. 2400 print"[147]aufgaben :":printu$
  144. 2410 print"1. berechnen sie   auf diese weise  die
  145. 2420 [153]"   laenge dieses programms.
  146. 2430 print"2. fre(0) beruecksichtigt auch den fuer
  147. 2440 [153]"   variablen benoetigten speicherplatz.
  148. 2445 print"   mit  diesem   maschinenprogramm  und
  149. 2450 [153]"   fre(0) koennen sie den fuer variable
  150. 2460 print"   benutzten speicherplatz bestimmen.
  151. 2470 [153]"3. versuchen sie mit hilfe der internen
  152. 2480 print"   uhr herauszufinden, wie schnell  das
  153. 2490 [153]"   programm ist [kbyte pro sekunde].
  154. 2510 i=12:gosub5000:ifflthen2200
  155. 2600 print"[147]4. warum wird   als startadresse  $03ff
  156. 2610 [153]"   und nicht $0400 gewaehlt ?
  157. 2620 print"5. wann wird der speicher $02 um 1  er-
  158. 2630 [153]"   hoeht ?
  159. 2640 print"6. bei welcher [160]adresse  genau  erfolgt
  160. 2650 [153]"   spaetestens der abbruch des suchens?
  161. 2660 print"7. warum laesst sich  als zaehler[160]nicht
  162. 2670 [153]"   einfach das xr oder yr verwenden ?
  163. 2680 print"8. die  innerste  schleife  beginnt bei
  164. 2690 [153]"   'inc $01',  die beiden aeusseren bei
  165. 2700 print"   'ldy #$00'. warum das ?
  166. 2710 [153]"- seite 13 -  <+> ontotototocmdcmdcmdcmdendewait <-> von vorne"
  167. 3060 [141]5020:[145]fl[137]0
  168. 3070 [153]"load":[128]
  169. 5000 [143] umblaettern
  170. 5010 [153]"  - seite";i;"-  <+> weiter  <-> zurueck";
  171. 5020 [129]i[178]0[164]11:[161]x$:[130]
  172. 5030 [161]x$:[139]x$[178]""[167]5030
  173. 5040 [139]x$[178]"+"[167]fl[178]0:[142]
  174. 5050 [139]x$[178]"-"[167]fl[178]1:[142]
  175. 5060 [137]5030
  176.